package com.ai.zhly.util;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.ImageOutputStream;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import com.sun.imageio.plugins.jpeg.JPEGImageWriter;

public class Base64ImgUtil {

	/**
	 * 强制压缩/放大图片到固定的大小
	 * 
	 * @param w
	 *            int 新宽度
	 * @param h
	 *            int 新高度
	 */
	public static String resize(int w, int h, String base64Img)
			throws IOException {
		// 1、base64解码
		BASE64Decoder decoder = new BASE64Decoder();
		byte[] bytes = decoder.decodeBuffer(base64Img);

		// 2、byte转输入流
		InputStream inputStream = new ByteArrayInputStream(bytes);

		// 3、输入流转图片
		BufferedImage img = ImageIO.read(inputStream);
		// 图片流
		BufferedImage image = new BufferedImage(w, h,
				BufferedImage.TYPE_INT_RGB);

		// 4、图片压缩
		// SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢
		image.getGraphics().drawImage(img, 0, 0, w, h, null); // 绘制缩小后的图

		// 图片编码，可以正常实现bmp、png、gif转jpg
		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
		
		//老方法，在JDK1.6下可用，JDK1.7不可用
//		JPEGImageEncoder jpegEncoder = JPEGCodec
//				.createJPEGEncoder(outputStream);
//		jpegEncoder.encode(image); // JPEG编码

		//新方法，JDK1.7可用
		ImageIO.write(image, "jpeg", outputStream); 
		
        
		// 5、输出流转byte
		byte[] outBytes = outputStream.toByteArray();
		outputStream.close();
		// 6、byte进行base64编码
		BASE64Encoder base64Encoder = new BASE64Encoder();
		base64Img = base64Encoder.encode(outBytes);
		return base64Img;
	}

	/**
	 * base64格式图片压缩
	 * 
	 * @param w
	 * @param h
	 * @param imgStr
	 * @return
	 * @throws IOException
	 */
	public static String base64ImgCompress(int w, int h, String imgStr)
			throws IOException {
		imgStr = resize(w, h, imgStr);
		return imgStr;
	}
}
